home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / lynx-2.4 / WWW / Library / Implementation / HTWriter.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-28  |  3.7 KB  |  188 lines

  1. /*        FILE WRITER            HTWrite.c
  2. **        ===========
  3. **
  4. */
  5. #include "HTUtils.h"
  6. #include "tcp.h"
  7.  
  8. #include "HTWriter.h"
  9.  
  10. #define BUFFER_SIZE 4096    /* Tradeoff */
  11.  
  12. /*#include <stdio.h> included by HTUtils.h -- FM */
  13.  
  14. #include "LYLeaks.h"
  15.  
  16. /*        HTML Object
  17. **        -----------
  18. */
  19.  
  20. struct _HTStream {
  21.     CONST HTStreamClass *    isa;
  22.  
  23.     int    soc;
  24.     char    *write_pointer;
  25.     char     buffer[BUFFER_SIZE];
  26. #ifdef NOT_ASCII
  27.     BOOL    make_ascii;    /* Are we writing to the net? */
  28. #endif
  29. };
  30.  
  31.  
  32. /*    Write the buffer out to the socket
  33. **    ----------------------------------
  34. */
  35.  
  36. PRIVATE void flush ARGS1(HTStream *, me)
  37. {
  38.     char *read_pointer     = me->buffer;
  39.     char *write_pointer = me->write_pointer;
  40.  
  41. #ifdef NOT_ASCCII
  42.     if (me->make_ascii) {
  43.         char * p;
  44.     for(p = me->buffer; p < me->write_pointer; p++)
  45.         *p = TOASCII(*p);
  46.     }
  47. #endif
  48.     while (read_pointer < write_pointer) {
  49.         int status;
  50.     status = NETWRITE(me->soc, me->buffer,  /* Put timeout? @@@ */
  51.             write_pointer - read_pointer);
  52.     if (status<0) {
  53.         if(TRACE) fprintf(stderr,
  54.         "HTWrite: Error: write() on socket returns %d !!!\n", status);
  55.         return;
  56.     }
  57.     read_pointer = read_pointer + status;
  58.     }
  59.     me->write_pointer = me->buffer;
  60. }
  61.  
  62.  
  63. /*_________________________________________________________________________
  64. **
  65. **            A C T I O N     R O U T I N E S
  66. */
  67.  
  68. /*    Character handling
  69. **    ------------------
  70. */
  71.  
  72. PRIVATE void HTWriter_put_character ARGS2(HTStream *, me, char, c)
  73. {
  74.     if (me->write_pointer == &me->buffer[BUFFER_SIZE]) flush(me);
  75.     *me->write_pointer++ = c;
  76. }
  77.  
  78.  
  79.  
  80. /*    String handling
  81. **    ---------------
  82. **
  83. **    Strings must be smaller than this buffer size.
  84. */
  85. PRIVATE void HTWriter_put_string ARGS2(HTStream *, me, CONST char*, s)
  86. {
  87.     int l = strlen(s);
  88.     if (me->write_pointer + l > &me->buffer[BUFFER_SIZE]) flush(me);
  89.     strcpy(me->write_pointer, s);
  90.     me->write_pointer = me->write_pointer + l;
  91. }
  92.  
  93.  
  94. /*    Buffer write.  Buffers can (and should!) be big.
  95. **    ------------
  96. */
  97. PRIVATE void HTWriter_write ARGS3(HTStream *, me, CONST char*, s, int, l)
  98. {
  99.  
  100.     CONST char *read_pointer     = s;
  101.     CONST char *write_pointer = s+l;
  102.  
  103.     flush(me);        /* First get rid of our buffer */
  104.  
  105.     while (read_pointer < write_pointer) {
  106.         int status = NETWRITE(me->soc, (char *)read_pointer,
  107.             write_pointer - read_pointer);
  108.     if (status<0) {
  109.         if(TRACE) fprintf(stderr,
  110.         "HTWriter_write: Error on socket output stream!!!\n");
  111.         return;
  112.     }
  113.     read_pointer = read_pointer + status;
  114.     }
  115. }
  116.  
  117.  
  118.  
  119.  
  120. /*    Free an HTML object
  121. **    -------------------
  122. **
  123. **    Note that the SGML parsing context is freed, but the created object is not,
  124. **    as it takes on an existence of its own unless explicitly freed.
  125. */
  126. PRIVATE void HTWriter_free ARGS1(HTStream *, me)
  127. {
  128.     flush(me);
  129.     NETCLOSE(me->soc);
  130.     free(me);
  131. }
  132.  
  133. PRIVATE void HTWriter_abort ARGS2(HTStream *, me, HTError, e)
  134. {
  135.     HTWriter_free(me);
  136. }
  137.  
  138.  
  139. /*    Structured Object Class
  140. **    -----------------------
  141. */
  142. PRIVATE CONST HTStreamClass HTWriter = /* As opposed to print etc */
  143. {        
  144.     "SocketWriter",
  145.     HTWriter_free,
  146.     HTWriter_abort,
  147.     HTWriter_put_character, HTWriter_put_string,
  148.     HTWriter_write
  149. }; 
  150.  
  151.  
  152. /*    Subclass-specific Methods
  153. **    -------------------------
  154. */
  155.  
  156. PUBLIC HTStream* HTWriter_new ARGS1(int, soc)
  157. {
  158.     HTStream* me = (HTStream*)malloc(sizeof(*me));
  159.     if (me == NULL) outofmem(__FILE__, "HTML_new");
  160.     me->isa = &HTWriter;       
  161.     
  162. #ifdef NOT_ASCII
  163.     me->make_ascii = NO;
  164. #endif    
  165.     me->soc = soc;
  166.     me->write_pointer = me->buffer;
  167.     return me;
  168. }
  169.  
  170. /*    Subclass-specific Methods
  171. **    -------------------------
  172. */
  173.  
  174. PUBLIC HTStream* HTASCIIWriter ARGS1(int, soc)
  175. {
  176.     HTStream* me = (HTStream*)malloc(sizeof(*me));
  177.     if (me == NULL) outofmem(__FILE__, "HTML_new");
  178.     me->isa = &HTWriter;       
  179.  
  180. #ifdef NOT_ASCII
  181.     me->make_ascii = YES;
  182. #endif    
  183.     me->soc = soc;
  184.     me->write_pointer = me->buffer;
  185.     return me;
  186. }
  187.  
  188.